﻿#define _CRT_SECURE_NO_WARNINGS
#include<iostream>
using namespace std;

//1.交换int类型两个数字；
void mySwapInt(int& a, int& b)
{
	int tmp = a;
	a = b;
	b = tmp;
}
//2.交换double类型数据；
void mySwapDouble(double& a, double& b)
{
	double tmp = a;
	a = b;
	b = tmp;
}
//3.参数类型不同，逻辑又非常相似；类型参数化，泛型编程---模板技术；
	//告诉编译器，下面如果出现T不要报错，T是一个通用的类型；
template<class T>
void mySwapTemplate(T& a, T& b)
{
	T tmp = a;
	a = b;
	b = tmp;
}

//8.template<typename T> 等价于template<class T>；
template<typename T>
void mySwapTypename() {};

void testSwap()
{
	int a = 10;
	int b = 20;
	char e = 'e';
	//mySwapInt(a, b);
	//4.自动类型推导，参数类型为int；必须有参数类型才可以推导；
	mySwapTemplate(a, b);
	//5.推导不出来T,所以不能运行；
	//mySwapTemplate(a, e);

	//6.显示指定类型；
	mySwapTemplate<int>(a, b);

	//7.模板必须要指定出T，才可以使用；
	mySwapTypename<double>();

	cout << "a= " << a << endl;//20 --> 20 --> 10
	cout << "b= " << b << endl;//10 --> 10 --> 20

	double c = 3.14;
	double d = 1.1;
	//mySwapDouble(c, d);
	mySwapTemplate(c, d);

	cout << "c= " << c << endl;//1.1 --> 1.1
	cout << "d= " << d << endl;//3.14 --> 3.14
}

//main297：函数模板的基本用法
int main297()
{
	testSwap();

	system("pause");
	return EXIT_SUCCESS;
}